package br.com.virtual.replicar.service;

import java.util.List;
import java.util.TreeMap;

import javax.ejb.Asynchronous;
import javax.ejb.EJB;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import br.com.virtual.replicar.model.Sincronizar;
import br.com.virtual.replicar.model.VirtualModelReplicacao;
import br.com.virtual.replicar.service.SincronizarService;

@Stateless
@Lock(LockType.READ)
public class ReplicadorPreparadorEntidade {
	
	public static boolean sincronizando = false;
	
	@EJB ReplicadorGravadorEntidade rplGravadorEntidade;
	@EJB SincronizarService sincronizarService;

	@Asynchronous
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public void iniciarReplicacao(){
		
		TreeMap<Sincronizar, VirtualModelReplicacao> itensReplicar = new TreeMap<Sincronizar, VirtualModelReplicacao>();
		
		if( sincronizando == false ){
			sincronizando = true;
			//RECUPERAR ENTIDADES
			List<Sincronizar> listSincronizar = getListaSincronizar();
	
			if(listSincronizar != null)
				for( Sincronizar itemSincronizar : listSincronizar ){
					
					VirtualModelReplicacao vmr = getEntidadeSincronizar(itemSincronizar);
					
					if( vmr != null )
						itensReplicar.put(itemSincronizar, vmr);
					else
						removerItemSincronizar(itemSincronizar);
				}
			
			//ENVIAR ITENS AO GRAVADOR.
			rplGravadorEntidade.executarAcaoEntidades(itensReplicar);
		
		}
		
		//EXECUTADO PARA TESTE
//		System.out.println("FIMMMM - iniciarReplicacao");
	}

	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public void removerItemSincronizar(Sincronizar sincronizar) {

		sincronizarService.delete(sincronizar);
		
		//EXECUTADO PARA TESTE
//		System.out.println("FIMMMM - removerItemSincronizar");
		
	}
	
	
	private List<Sincronizar> getListaSincronizar() {
		
		List<Sincronizar> itens = null;
		Long intensSincronizar = sincronizarService.count();
	
		if (intensSincronizar != null && intensSincronizar >= 1) {
			itens = sincronizarService.getList();
		}
	
		return itens;
	}
	
	private VirtualModelReplicacao getEntidadeSincronizar(Sincronizar itemSincronizar) {
		return sincronizarService.getObjetoSincronizar(itemSincronizar);
	}

	
}
